package com.ruoyi.web.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.bean.BeanValidators;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.web.domain.mes.MesUser;
import com.ruoyi.web.mapper.MesUserMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import javax.validation.Validator;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Pattern;
import java.util.stream.Collectors;

@Service
public class IMesUserService {
    @Resource
    private MesUserMapper mesUserMapper;
    @Resource
    private Validator validator;

    /**
     * 人员信息 -- 查询
     *
     * @Date: 2024年1月2日
     * @Auth: 张恒
     */
    public TableDataInfo getMesUserInfo(MesUser mesUser) {
        PageHelper.startPage(mesUser.getPageNum(), mesUser.getPageSize());
        List<MesUser> mesUsers = mesUserMapper.selectMesUserInfo(mesUser);
        PageInfo pageInfo = new PageInfo<>(mesUsers);
        TableDataInfo tableDataInfo = new TableDataInfo();
        tableDataInfo.setCode(200);
        tableDataInfo.setTotal(pageInfo.getTotal());
        tableDataInfo.setRows(pageInfo.getList());
        return tableDataInfo;
    }

    /**
     * 人员信息 -- 新增
     *
     * @Date: 2024年1月2日
     * @Auth: 张恒
     */
    public AjaxResult addMesUserInfo(MesUser mesUser) {
        String username = SecurityUtils.getUsername();
        Date date = new Date();
        mesUser.setCreateBy(username);
        mesUser.setCreateTime(date);

        // 查询当月的数据
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH) + 1;
        MesUser mesUser1 = new MesUser();
        mesUser1.setYearTime(year);
        mesUser1.setMonthTime(month);
        List<MesUser> mesUsers = mesUserMapper.selectMesUserInfo(mesUser1);
        // 获取最大的序号
        Integer maxNum = 0;
        if (mesUsers.size() > 0) {
            for (MesUser user : mesUsers) {
                if (maxNum.compareTo(user.getCodeNum()) < 0) {
                    maxNum = user.getCodeNum();
                }
            }
        }
        maxNum = maxNum + 1;
        String code = "";
        if (maxNum < 10) {
            code = "000" + maxNum.toString();
        } else if (maxNum >= 10 && maxNum < 100) {
            code = "00" + maxNum.toString();
        } else if (maxNum >= 100 && maxNum < 1000) {
            code = "0" + maxNum.toString();
        } else {
            code = maxNum.toString();
        }
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMM");
        String format2 = simpleDateFormat.format(date);
        mesUser.setCode("RY" + format2 + "-" + code);
        BeanValidators.validateWithException(validator, mesUser);
        // 正则校验
        String idCard = "(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)"; // 定义身份证号的正则表达式
        String tel = "^1[3|4|5|6|7|8|9][0-9]\\d{8}$"; // 手机号正则校验
        if (!Pattern.matches(idCard, mesUser.getIdCard())) {
            return AjaxResult.error("身份证号[" + mesUser.getIdCard() + "]有误");
        }
        if (!Pattern.matches(tel, mesUser.getTelephone())) {
            return AjaxResult.error("联系电话[" + mesUser.getTelephone() + "]有误");
        }
        // 查询历史数据
        mesUserMapper.insertMesUserInfo(mesUser);
        return AjaxResult.success(mesUser);
    }

    /**
     * 人员信息 -- 修改
     *
     * @Date: 2024年1月3日
     * @Auth: 张恒
     */
    public AjaxResult editMesUserInfo(MesUser mesUser) {
        if (mesUser.getId() == null) {
            return AjaxResult.error("未获取到修改数据的主键");
        }
        String username = SecurityUtils.getUsername();
        Date date = new Date();
        mesUser.setUpdateBy(username);
        mesUser.setUpdateTime(date);
        // 正则校验
        if (StringUtils.isNotBlank(mesUser.getIdCard())) {
            String idCard = "(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)"; // 定义身份证号的正则表达式
            if (!Pattern.matches(idCard, mesUser.getIdCard())) {
                return AjaxResult.error("身份证号[" + mesUser.getIdCard() + "]有误");
            }
        }
        if (StringUtils.isNotBlank(mesUser.getTelephone())) {
            String tel = "^1[3|4|5|6|7|8|9][0-9]\\d{8}$"; // 手机号正则校验
            if (!Pattern.matches(tel, mesUser.getTelephone())) {
                return AjaxResult.error("联系电话[" + mesUser.getTelephone() + "]有误");
            }
        }
        mesUserMapper.updateMesUserInfo(mesUser);
        return AjaxResult.success();
    }

    public MesUser selectMesUserById(Long id) {
        return mesUserMapper.selectMesUserById(id);
    }

    /**
     * 人员信息 -- 删除
     *
     * @Date: 2024年1月3日
     * @Auth: 张恒
     */
    public AjaxResult delMesUserInfo(MesUser mesUser) {
        if (mesUser.getId() == null) {
            return AjaxResult.error("未获取到修改数据的主键");
        }
        mesUserMapper.delMesUserInfo(mesUser);
        return AjaxResult.success();
    }

    /**
     * 人员信息 -- 下载模板
     *
     * @Date: 2024年1月3日
     * @Auth: 张恒
     */
    public AjaxResult exportTemplate() {
        ExcelUtil<MesUser> util = new ExcelUtil<>(MesUser.class);
        return util.exportExcel(Collections.emptyList(), "人员信息模板");
    }

    /**
     * 人员信息 -- 导入
     *
     * @Date: 2024年1月3日
     * @Auth: 张恒
     */
    @Transactional
    public AjaxResult importMesUserInfo(MultipartFile file) {
        String username = SecurityUtils.getUsername();
        Date date = new Date();
        ExcelUtil<MesUser> util = new ExcelUtil<>(MesUser.class);
        List<MesUser> mesUsers = new ArrayList<>();
        // 保存错误信息
        StringBuffer error = new StringBuffer();
        try {
            // 获取实体类里设置的注解字段
            List<String> fieldVo = util.getFieldVo();
            // 获取导入的文件标头信息
            List<String> titleInfo = util.getTitleFile(null, file.getInputStream());
            if (fieldVo.size() != titleInfo.size()) {
                return AjaxResult.error("导入的文件标头和模板不一致；");
            }
            for (int i = 0; i < fieldVo.size(); i++) {
                if (!fieldVo.get(i).equals(titleInfo.get(i))) {
                    error.append("第[" + (i + 1) + "]列[" + titleInfo.get(i) + "]，标头信息错误，正确标头应为[" + fieldVo.get(i) + "]；");
                }
            }
            if (!StringUtils.isBlank(error.toString())) {
                return AjaxResult.error(error.toString());
            }

            mesUsers = util.importExcel(file.getInputStream());
        } catch (Exception e) {
            e.printStackTrace();
            return AjaxResult.error("导入失败：" + e.getMessage());
        }
        if (mesUsers == null || mesUsers.size() == 0) {
            return AjaxResult.error("导入模板中数据不能为空！");
        }
        // 查询历史数据
        List<MesUser> mesUsersList = mesUserMapper.selectMesUserInfo(new MesUser());
        Map<String, MesUser> map = mesUsersList.stream().collect(Collectors.toMap(MesUser::getIdCard, e -> e));

        // 查询当月的数据
        Calendar cal = Calendar.getInstance();
        int year = cal.get(Calendar.YEAR);
        int month = cal.get(Calendar.MONTH) + 1;
        MesUser mesUser1 = new MesUser();
        mesUser1.setYearTime(year);
        mesUser1.setMonthTime(month);
        List<MesUser> mesUserList = mesUserMapper.selectMesUserInfo(mesUser1);
        // 获取最大的序号
        Integer maxNum = 0;
        if (mesUserList.size() > 0) {
            for (MesUser mesUser : mesUserList) {
                if (maxNum.compareTo(mesUser.getCodeNum()) < 0) {
                    maxNum = mesUser.getCodeNum();
                }
            }
        }
        maxNum = maxNum + 1;

        ArrayList<MesUser> mesUsersAdd = new ArrayList<>();
        ArrayList<MesUser> mesUsersEdit = new ArrayList<>();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMM");
        // 校验数据
        for (MesUser e : mesUsers) {
            // 正则校验
            String idCard = "(^\\d{15}$)|(^\\d{18}$)|(^\\d{17}(\\d|X|x)$)"; // 定义身份证号的正则表达式
            String tel = "^1[3|4|5|6|7|8|9][0-9]\\d{8}$"; // 手机号正则校验
            if (!Pattern.matches(idCard, e.getIdCard())) {
                throw new BaseException("身份证号[" + e.getIdCard() + "]有误");
            }
            if (!Pattern.matches(tel, e.getTelephone())) {
                throw new BaseException("联系电话[" + e.getTelephone() + "]有误");
            }
            // 该证件号存在，属于修改
            MesUser user = map.get(e.getIdCard());
            if (user != null && user.getId() != null) {
                e.setId(user.getId());
                e.setUpdateBy(username);
                e.setUpdateTime(date);
                mesUsersEdit.add(e);
            } else {
                String code = "";
                if (maxNum < 10) {
                    code = "000" + maxNum.toString();
                } else if (maxNum >= 10 && maxNum < 100) {
                    code = "00" + maxNum.toString();
                } else if (maxNum >= 100 && maxNum < 1000) {
                    code = "0" + maxNum.toString();
                } else {
                    code = maxNum.toString();
                }
                String format2 = simpleDateFormat.format(date);
                e.setCode("RY" + format2 + "-" + code);
                e.setCreateBy(username);
                e.setCreateTime(date);
                BeanValidators.validateWithException(validator, e);
                mesUsersAdd.add(e);
                maxNum++;
            }

        }
        // 修改
        if (mesUsersEdit.size() > 0) {
            mesUserMapper.updateMesUserInfoList(mesUsersEdit);
        }
        // 新增
        if (mesUsersAdd.size() > 0) {
            mesUserMapper.insertMesUserInfoList(mesUsersAdd);
        }
        return AjaxResult.success();
    }

    /**
     * 人员信息 -- 导出
     *
     * @Date: 2024年1月4日
     * @Auth: 张恒
     */
    public AjaxResult exportMesUserInfo(MesUser mesUser) {
        // 查询导出的数据
        List<MesUser> mesUsersList = mesUserMapper.selectMesUserInfo(mesUser);
        ExcelUtil<MesUser> util = new ExcelUtil<>(MesUser.class);
        return util.exportExcel(mesUsersList, "人员信息导出");
    }
}
